package ejb.casacentral.service.controller;

import java.io.FileNotFoundException;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

import comun.casacentral.proxy.ofiventa.cotizado.ListadoRodCotizadoXML;
import comun.casacentral.proxy.ofiventa.cotizado.RodamientoCotizadoXML;
import comun.casacentral.proxy.ofiventa.cotizar.ListadoRodCotizarXML;
import comun.casacentral.proxy.ofiventa.cotizar.RodamientoCotizarXML;
import comun.casacentral.proxy.ofiventa.rodamientonuevo.ItemRodamientoNuevoXML;
import comun.casacentral.proxy.ofiventa.rodamientonuevo.RodamientoNuevoOficinaXML;
import comun.casacentral.proxy.parceador.UtilsXML;
import comun.casacentral.proxy.proveedor.listado.RodamientoListadoPrecioXML;
import comun.casacentral.proxy.proveedor.rodamientonuevo.RodamientoNuevoProveedorXML;

import ejb.casacentral.log.CasaLogger;
import ejb.casacentral.persistence.entity.ItemListadoPrecio;
import ejb.casacentral.persistence.entity.ListadoPrecios;
import ejb.casacentral.persistence.entity.Proveedor;
import ejb.casacentral.persistence.entity.Rodamiento;
import ejb.casacentral.persistence.entity.Vigencia;

@SuppressWarnings("all")
@Stateless
public class RodamientoControllerBean implements RodamientoController, Serializable {

	
	@EJB
	private ProveedorController proveedorController;
	
	@EJB
	private ServiceCall serviceCall;
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@PersistenceContext(unitName="casacentral")
	private EntityManager em;
	
	
	public RodamientoControllerBean(){
		
	}
	
	@Override
	public String getCotizacion(String rodamientos) {
		
		CasaLogger.log(rodamientos);
		
		ListadoRodCotizarXML listado = null;
		UtilsXML parcer= new UtilsXML();
		
		try {
			listado = parcer.toClase(rodamientos, ListadoRodCotizarXML.class);
		} catch (Exception e) {
			
			CasaLogger.log("Error parseo xml a cotizar.");
			e.printStackTrace();
		}
		
		ListadoRodCotizadoXML listadoCotizado = new ListadoRodCotizadoXML();
		
		List<RodamientoCotizadoXML> items = new ArrayList<RodamientoCotizadoXML>();

		for(RodamientoCotizarXML rod : listado.getItems()){
			
			RodamientoCotizadoXML nuevoItem=new RodamientoCotizadoXML();
			nuevoItem.setPrecio(0);
			nuevoItem.setCantidad(rod.getCantidad());
			nuevoItem.setCodigo(rod.getCodigo());
			CasaLogger.log(" obteniendo entidad .... ");
			List<ListadoPrecios> xListadoPrecios=  em.createNamedQuery("ListadoPrecios.todas").getResultList();
			
			List<ItemListadoPrecio> rodamientosLis = em.createQuery("From ItemListadoPrecio item where item.rodamiento.codigo = :codigo").setParameter("codigo", rod.getCodigo()).getResultList();
			
			Rodamiento rodamient = rodamientosLis.get(0).getRodamiento();
			
			nuevoItem.setPrecio(new Float (rodamientosLis.get(0).getPrecio()));
			
			items.add(nuevoItem);
//			boolean flag=false;
//			for(int j=0;j<xListadoPrecios.size()&&!flag;j++){
//				ListadoPrecios xListado=xListadoPrecios.get(j);
//				Vigencia xVigencia=xListado.getVigencia();
//				SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
//				try{
//				Date xDesde=format.parse(xVigencia.getFechaDesde());
//				Date xHasta=format.parse(xVigencia.getFechaHasta());
//				Date xActual=new Date();
//				@SuppressWarnings("deprecation")
//				Date xActualDate=format.parse(String.valueOf(xActual.getYear()+1900)+"-"+String.valueOf(xActual.getMonth()+1)+"-"+String.valueOf(xActual.getDate()));
//				if(xActualDate.compareTo(xDesde)>=0&&xActualDate.compareTo(xHasta)<=0){
//					List<ItemListadoPrecio> xListadoRod=xListado.getRodamientos();
//					for(int x=0;x<xListadoRod.size()&&!flag;x++){
//						ItemListadoPrecio item=xListadoRod.get(x);
//						if(item.getRodamiento().getCodigo().toUpperCase().equals(nuevoItem.getCodigo().toUpperCase())){
//							flag=true;
//							nuevoItem.setPrecio(Float.valueOf(String.valueOf(item.getPrecio())));
//							items.add(nuevoItem);
//						}
//					}
//				}
//				}catch(ParseException e){
//					CasaLogger.log("Error formateo de vigencia en obtencion de cotizacion.");
//					e.printStackTrace();
//				}
//			}	
		}
		listadoCotizado.setItems(items);
		String xmlResult=parcer.toXML(listadoCotizado, ListadoRodCotizadoXML.class);
		return xmlResult;
		
		
		
	}
	
	@Override
	public String nuevoRodamiento(String rodamiento) {
		CasaLogger.log(" via webservice..");

		RodamientoNuevoProveedorXML romdamientoNuevoXml = null;
		UtilsXML parcer = new UtilsXML();

		try {
			romdamientoNuevoXml = parcer.toClase(rodamiento, RodamientoNuevoProveedorXML.class);
		} catch (FileNotFoundException e) {
			CasaLogger.log();
			e.printStackTrace();
		}
		
		Proveedor prov = null;


		prov = proveedorController.obtenerProveedorPorCodigo(romdamientoNuevoXml.getCod_propietario());
		
		
		if (prov == null){
			CasaLogger.log("Proveedor no encontrado, se lo dara de alta...");
			prov =  proveedorController.nuevoProveedor(romdamientoNuevoXml.getCod_propietario());
		}

		//TODO arreglar clase de negocio
		Rodamiento rod = new Rodamiento(romdamientoNuevoXml.getCodigoRodamiento(),
				romdamientoNuevoXml.getCaracteristica(), 
				romdamientoNuevoXml.getMarca(), romdamientoNuevoXml.getOrigen(),
				 " ",prov);

		CasaLogger.log(" persistiendo entidad .... "); em.merge(rod);
		em.flush();

		RodamientoNuevoOficinaXML rodamientoxml = new RodamientoNuevoOficinaXML();

		rodamientoxml.setCodigo(rod.getCodigo());
		rodamientoxml.setDescripcion(rod.getDescripcion());
		rodamientoxml.setCaracteristica(rod.getCaracteristica());
		rodamientoxml.setMarca(rod.getMarca());
		rodamientoxml.setOrigen(rod.getOrigen());

		UtilsXML parseador = new UtilsXML();

		comun.casacentral.proxy.ofiventa.rodamientonuevo.ItemRodamientoNuevoXML itemXML = new comun.casacentral.proxy.ofiventa.rodamientonuevo.ItemRodamientoNuevoXML();
		itemXML.setRodamiento(rodamientoxml);
		String rodamientosXML = parseador.toXML(itemXML,ItemRodamientoNuevoXML.class);
		
		serviceCall.enviarNuevoRodamiento(rodamientosXML);
		
		return "OK";
	}

	@Override
	public Rodamiento obtenerRodamientoPorCodigo(String codigoRodamiento) {
		CasaLogger.log(" obteniendo entidad .... ");
		Rodamiento rod = null;
		   try{
	        	CasaLogger.log(" obteniendo entidad .... ");
	            rod =  (Rodamiento)  em.createNamedQuery("Rodamiento.porCodigo").setParameter("codigo", codigoRodamiento).getSingleResult();
	        }catch (NoResultException e) {
	            CasaLogger.log("no se encontro el proveedor.... ");
	        }
		return rod;
	}



		private Rodamiento parseoListadoRodamiento(
			RodamientoListadoPrecioXML rodamientoListadoPrecioXML) {
		Rodamiento rodamiento = new Rodamiento();
		rodamiento.setCodigo(rodamientoListadoPrecioXML.getCodigo()) ;
		return rodamiento;
	}

	@Override
	public Rodamiento guardarRodamiento(RodamientoListadoPrecioXML rodamientoXML) {
		Rodamiento rodamiento = new Rodamiento();
		rodamiento.setCodigo(rodamientoXML.getCodigo());
		em.merge(rodamiento);
		em.flush();
		return rodamiento;
	}

	
	
	
//	@Override
//	public Rodamiento guardarRodamientoNuevoPorXML(String xml) {
//		
//		CasaLogger.log();
//		
//		RodamientoXML rodxml = null;
//		UtilsXML parcer= new UtilsXML();
//		
//		try {
//			rodxml = parcer.toClase(xml, RodamientoXML.class);
//		} catch (FileNotFoundException e) {
//			CasaLogger.log();
//			e.printStackTrace();
//		}
//		
//		Proveedor prov=persistencia.findbyCodigo(rodxml.getCodigoPropietario(), Proveedor.class);
//		
//		Rodamiento rod = new Rodamiento(rodxml.getCodigo(), rodxml.getCaracteristica(), rodxml.getTipo(), rodxml.getMarca(), rodxml.getOrigen(), prov);
//		
//		persistencia.save(rod, Rodamiento.class);	
//		
//		return rod;
//		
//	}

}
